Branch instruction

cmp
cmp    vleft, vright        ;vleft-vright 결과값의 형태에 따라서 flag에 저장(compare insturction)
cmp vleft=vright vleft>vright vleft<vright
ZF 1 0 0
CF 0 0 1
ZF(zero flag), CF(carry flag)
        Branch instruction
jmp            (SHORT, NEAR, FAR)
jmp    L1                ;L1으로 무조건 분기(near 이 기본형임)
short jmp                ;signed 1byte로 표기(-128-127byte 이동가능) 세그먼트 내에서
near jmp                 ;signed 2byte로 표기(appropriciate -32,000-32,000byte 이동가능) 세그먼트 내에서
far jmp                    ;다른 코드세그먼트로의 분기를 허용
JZ ZF가 세트 될 때 에만 분기
JNZ ZF가 언세트 될 때 에만 분기
JO OF가 세트 될 때 에만 분기
JNO OF가 언세트 될 때 에만 분기
JS SF가 세트 될 때 에만 분기
JNS SF가 언세트 될 때 에만 분기
JC CF가 세트 될 때 에만 분기
JNC CF가 언세트 될 때 에만 분기
JP PF가 세트 될 때 에만 분기
JNP PF가 언세트 될 때 에만 분기
if(EAX==0){
EBX=1;
}else{
EBX=2;
}
then make source file which activate same as above C/C++ in assembly
cmp eax, 0
jz thenblock
mov ebx, 2
jmp next
thenblock:
mov ebx, 1
next:
mov ebx, 2
if(EAX>=5){
EBX=1;
}else{
EBX=2;
}
make it again
cmp eax, 5
js signon
jo elseblock
jmp thenblock
signon:
jo thenblock
elseblock:
mov ebx, 2
jmp next
thenblock:
mov ebx, 1
next:
codes be significant difficult, for this problem 80x86 give us few instruction
SIGNED UNSIGNED
JE   vleft = vright 이면 분기 JE   vleft = vright 이면 분기
JNE   vleft != vright 이면 분기 JNE   vleft != vright 이면 분기
JL, JNGE   vleft < vright 이면 분기 JB, JNAE
JLE, JNG   vleft <= vright 이면 분기 JBE, JNA   vleft <= vright 이면 분기
JG, JNLE   vleft > vright 이면 분기 JA, JNBE   vleft > vright 이면 분기
JGE, JNL   vleft >= vright 이면 분기 JAE, JNB   vleft >= vright 이면 분기
can make above assembly codes simly
cmp eax, 5
jge thenblock
mov ebx, 2
jmp next
thenblock:
mov ebx,1
next:
Loop instruction
Loop instruction is active similar with ‘for' in C/C++
LOOP                            ECX의 값을 감소시키고, ECX != 0이면 라벨로 분기한다.
LOOPE, LOOPZ            ECX의 값을 감소시키고 (플래그 레지스터의 값은 바뀌지 않는다.) 만일 ECX != 0이고 ZF = 1 이면 분기한다.
LOOPNE, LOOPNZ       ECX의 값을 감소시키고 (플래그 레지스터의 값은 바뀌지 않는다.) 만일 ECX != 0이고 ZF = 0 이면 분기한다.
sum=0;
for(i=10;i>0;i--){
sum+=i;
}
mov eax, 0 ;eax is same as sum
mov ecx, 10 ;ecx is same as i
loop_start:
add eax, ecx
loop loop_start
loop를 cmp와 jmp를 이용해서 구현할 수 있다.